package com.chen.utils;

import java.io.InputStream;
import java.sql.*;
import java.util.Properties;

//公用
public class ChenJdbcUtils {
    /**
    * 1.需要将我们的构造方法私有化 ---工具类 不需要 new出来 是通过类名称.方法名称访问
    */
    private ChenJdbcUtils() {
        
    }
    
    /**
    * 2.定义工具类 需要 声明 变量
    */
    private static String driverClass;
    private static String url;
    private static String user;
    private static String password;
    
    /**
    *3.使用静态代码快 来给我们声明好 jdbc变量赋值（读取config.properties）
    */
    static {
        try {
            // 1.读取config.properties  IO 路径 相对路径
            InputStream resourceAsStream =
                    ChenJdbcUtils.class.getClassLoader().getResourceAsStream("config.properties");
            // 2.赋值给我们声明好的变量
            Properties properties = new Properties();
            properties.load(resourceAsStream);
            driverClass = properties.getProperty("driverClass");
            url = properties.getProperty("url");
            user = properties.getProperty("user");
            password = properties.getProperty("password");
            // 3.注册驱动类
            Class.forName(driverClass);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    
    /**
    * 4.封装连接方法
    */
    public static Connection getConnection() throws SQLException {
        Connection connection = DriverManager.getConnection(url, user, password);
        return connection;
    }
    
    /**
    * 5.封装释放连接方法 (重载)
    */
    public static void closeConnection(ResultSet resultSet, Statement statement, Connection connection) {
        // 1.查询 释放连接 resultSet  statement connection
        try {
            if (resultSet != null)
                resultSet.close();
            if (statement != null)
                statement.close();
            if (connection != null)
                connection.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
        
    }
    
    /**
    * 增删改---释放jdbc资源
    */
    public static void closeConnection(Statement statement, Connection connection) {
        // 1.查询 释放连接 resultSet  statement connection
        closeConnection(null, statement, connection);
    }
    
    /**
    * 开启事务
    */
    public static void beginTransaction(Connection connection)
            throws SQLException {
        /**
         * connection.setAutoCommit(false);：
         * 调用Connection对象的setAutoCommit方法，并将参数设置为false。
         * 这表示关闭自动提交模式，即所有的数据库操作都不会立即提交到数据库，
         * 而是需要显式地调用commit方法来提交事务，或者调用rollback方法来回滚事务。
         */
        connection.setAutoCommit(false);
    }
    
    /**
    * 提交事务
    */
    public static void commitTransaction(Connection connection)
            throws SQLException {
        /**
         * connection.commit();：调用Connection对象的commit方法。
         * 这个方法的作用是提交当前的事务，
         * 将自上次事务提交或回滚以来进行的所有更改永久保存到数据库中。
         */
        connection.commit();
    }
    
    /**
    * 回滚事务
    */
    public static void rollBackTransaction(Connection connection) {
        /**
         * 尝试调用Connection对象的rollback方法。
         * 这个方法的作用是撤销自上次事务提交或回滚以来进行的所有更改，
         * 将数据库状态回滚到事务开始前的状态。
         */
        if (connection != null) {
            try {
                connection.rollback();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }
    
    /**
    * 关闭事务
    */
    public static void endTransaction(Connection connection) {
        if (connection != null) {
            try {
                connection.setAutoCommit(true);
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }
    
}
